package com.ruoyi.heima.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.heima.domain.po.NewsType;
import com.ruoyi.heima.mapper.NewsTypeMapper;
import com.ruoyi.heima.service.INewsTypeService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.util.List;

@Service
public class NewsTypeServiceImpl extends ServiceImpl<NewsTypeMapper, NewsType> implements INewsTypeService {

    @Override
    public Boolean insertNewsType(NewsType newsType) {
        newsType.setCreateTime(DateUtils.getNowDate());
        return save(newsType);
    }

    @Override
    public List<NewsType> selectNewsTypeList(NewsType newsType) {
        // 第1个参数：进行条件判断，如果不为空，则模糊查询
        // 第2个参数：Lambda 表达式（函数引用），表示要查询的字段，MyBatis-Plus 会根据这个 Lambda 表达式自动映射到数据库表中的相应列名
        // 第3个参数：要查询的字段的值-这是要匹配的具体值
        List<NewsType> newsTypeList = lambdaQuery().like(StringUtils.isNotEmpty(newsType.getTypeName()), NewsType::getTypeName, newsType.getTypeName())
                .list();
        // 返回查询结果
        return newsTypeList;
    }

    @Override
    public NewsType selectNewsTypeByTypeId(Long newsTypeId) {
        NewsType newsType = getById(newsTypeId);
        return newsType;
    }

    @Override
    public List<NewsType> getAll() {
        List<NewsType> newsTypeList = lambdaQuery().list();
        return newsTypeList;
    }

    @Override
    public Boolean updateNewsType(NewsType newsType) {
        newsType.setUpdateTime(DateUtils.getNowDate());

        return lambdaUpdate().eq(NewsType::getTypeId, newsType.getTypeId())
                .update(newsType);
    }

    @Override
    public Boolean deleteNewsTypeByTypeIds(List<Long> typeIds) {
        for (int i = typeIds.size() - 1; i >= 0; i--){
            List<NewsType> newsTypes = lambdaQuery().eq(NewsType::getParentId, typeIds.get(i)).list();
            // 如果typeIds有父类id，则把该id移除
            if (!CollectionUtils.isEmpty(newsTypes)) {
                typeIds.remove(i);
            }
        }
        if (typeIds.size() == 0){
            throw new ServiceException("选中分类存在子分类,不可删除！");
        }
        // 如果类型id有父类id，则删除
        return removeByIds(typeIds);
    }

    @Override
    public Boolean deleteNewsTypeByTypeId(Long typeId) {
        NewsType newsType = lambdaQuery().eq(NewsType::getParentId, typeId).one();
        if (!ObjectUtils.isEmpty(newsType)) {
            throw new ServiceException("该分类存在子分类,不可删除！");
        }
        return removeById(typeId);
    }
}